#include "os_ticket.h"

#include "../tlog/tlog.h"
#include "../systicket/systicket.h"

#define TAG "TICKET_OS"

#define OS_THREAD_MAX 16

/***************************************************************************************************
 * ******************************************static var******************************************* *
 ***************************************************************************************************/
static OS_TICKET_THREAD_T s_thread_table[OS_THREAD_MAX]; /* 线程表 */
static uint32_t           s_thread_now = 0;              /* 当前拥有的线程计数 */

/***************************************************************************************************
 * ******************************************static func****************************************** *
 ***************************************************************************************************/
/**
 * @brief   调度器(计算当前时间距离上次运行时间间隔是否超出了周期，如果超出则运行并更新时间)
 * @param   OS_TICKET_THREAD_T* s_thread_table 当前要运行的线程
 * @retval  void
 * @note
 */
static void os_systempause_scheduler(OS_TICKET_THREAD_T* s_thread) {
  if (m_get_ticket_ms() - s_thread->last_time >= s_thread->cycle) {
    s_thread->last_time = m_get_ticket_ms();
    s_thread->thread();
  }
}

/***************************************************************************************************
 * *********************************************************************************************** *
 ***************************************************************************************************/
/**
 * @brief   创建线程
 * @param   os_cb thread   回调函数
 * @param   uint32_t cycle 周期
 * @retval  void
 * @note
 */
bool os_create_thread(os_cb thread, uint32_t cycle_ms) {
  /* 当前线程数量是否是超过最大数量 */
  if (s_thread_now >= OS_THREAD_MAX) {
    TLOGI(TAG, "The maximum number of created items is reached\n");
    return false;
  }
  s_thread_table[s_thread_now].thread = thread;
  s_thread_table[s_thread_now].cycle  = cycle_ms;
  s_thread_now += 1; /* 当前线程数量加一 */
  return true;
}

/**
 * @brief   开启线程运行
 * @retval  void
 * @note
 */
void os_thread_start(void) {
  while (true) {
    for (size_t i = 0; i < s_thread_now; i++) {
      os_systempause_scheduler(&s_thread_table[i]);
    }
  }
}

